package com.summer.proxy1;

public class ProxyTest {
    public static void main(String[] args) {
        //1.对Tank移动进行日志输出代理
//        new StatciProxy1(new Tank()).move();
        //2.对Tank移动进行性能输出代理
//        new StaticProxy2(new Tank()).move();
        //3.对tank移动进行日志输出并且性能检测的代理
        new StaticProxy2(new StatciProxy1(new Tank())).move();

        //总结：静态代理的模式跟装饰器模式语法结构一致，只是语义上不一致
        //静态代理虽然可以对实现moveable接口的类中的方法进行代理，但是还是不够灵活，
        //我们要是可以做到对Object类进行代理就好了，也就是说我们代理方法的逻辑跟被代理类之间
        //分离开来，不仅可以代理moveable接口实现类，也可以代理其他类
        //也就是动态代理，但是动态代理的实现方式也有很多，jdk动态代理，要求必须要有接口
        //cglib的动态代理要求被代理类不能是final，而且就算我们将代理逻辑抽出来一个类中的方法，
        //当我们想要对某个代理对象进行代理逻辑的修改的时候，也是需要改代码的
        //如果我们采用配置文件的形式去配置，确实可以提高灵活性，但是还是有缺陷，我们想对某个类进行代理，就需要持有配置文件对象，并且获取相应代理逻辑的Instance
        //这部分代码也是重复的，进而更灵活的方式出现了，SpringIOC和AOP,IOC,可以帮我们加载我们抽取出的代理逻辑，AOP可以帮我们配置被代理对象和代理对象，以及
        //代理逻辑切入点，所以理解代理设计模式，更好的理解SpringIOC(工厂模式，可以灵活帮我们扩展实例对象以及产品族对象)和AOP（灵活配置丰富原有的业务逻辑）

    }
}
